iT邦幫忙

2024 iThome 鐵人賽

0

雖然鐵人賽已經順利完成,但開發的套件還是會持續更新,剛好又有想分享的就有這篇出來,有興趣的還是可以看看。

Formatter

Formatter 是在程式開發的時候,幫助我們程式排版的工具,裡面會定義一些寫程式的規則,然後在編輯器上檢查程式碼是否符合規則,然後會在上面有提醒像是 Warning 跟 Error 的 Highlight。也可以使用他們的 autofix 功能自動排版。在 Day 03 - VSCode 程式編輯器 的時候有簡單介紹了一下 Formatter,不過那時候是編輯器的設定,但我後來在開發的過程,想說如果要大家都一樣的話,可能還是要設定一下。
經過調查一下過後,我看滿多人推薦 Ruff 這個 formatter。原因有幾點,第一個是他可以自動幫你結合其他 Formatter 規則,可以自己選定要套用哪些,這個我覺得滿方便的,跟 Eslint 的 Plugin 有點像。再來是他可以直接在 pyproject.toml 設定,不用特別多創建設定檔。快速的使用方法:

# 安裝套件
pip install ruff

# 檢查程式碼是否都有符合規則
ruff check

# 檢查程式碼是否有可以 autofix 的地方
ruff format --check

# 進行程式碼 autofix
ruff format

設定檔的話我是參考 Python 開發:Ruff Linter、Formatter 介紹 + 設定教學 裡提到的 FastAPI 設定,因為老實說我也不知道全部有哪些規則,想說先用個試試看再慢慢調整,簡單會使用 select 選擇要套用的規則,ignore 可以無視特定規則,文章裡也提供與 VSCode 連結的方法,很值得一看。

Pre-commit

設定完 ruff,接下來就會想用自動化的東西,有兩個時候可以執行,一個是跟 pytest 的檢查一樣,在當我們有新的 commit 的時候可以執行 ruff check 去檢查有遺漏的不符合規則的程式碼,就可以讓所有貢獻者的程式碼都使用一樣的規則在寫。一樣寫進 Workflow 裡,就會跟 pytest 一起檢查。我有試過把 checkpublish 分開,但他好像要進 main 的時候才會分別跑,還在試,有好的解法歡迎讓我知道!

另外想講另一個工具 pre-commit,這也是自動化的工具,不過跟 Workflow 不一樣,他會在我們執行 git commit 的時候幫我們用 formatter autofix,等於說在 commit 新的改動前,他又會再幫我們檢查程式碼撰寫規則,找到可以 autofix 的幫我們自動處理,這樣我們就不用每次自己執行 ruff format 之類的指令。會用設定檔 .pre-commit-config.yaml 來管理。

在用 pre-commit 配合 ruff 的時候我有遇到一個問題,就是 Python import 的順序自動修改,不知道為什麼在 autofix 的時候不會執行,我後來是參考 https://github.com/astral-sh/ruff/issues/10882

 hooks:
      - id: ruff
        name: lint with ruff
      - id: ruff
        name: sort imports with ruff
        args: [--select, I, --fix]
      - id: ruff-format

這樣改有成功解決,原因是規則 I001F401 有執行衝突的樣子,pyproject.toml 裡的 select 也要改成:

[tool.ruff.lint]
select = [
  "E",  # pycodestyle errors
  "F",  # pyflakes
  "UP", # pyupgrade
]
extend-select = [
  "I", # isort
]

小結

這次介紹 Formatterpre-commit 是因為我覺得在開源的時候,有個能自動化檢查與 fix 的程式碼規則,可以有效幫助我們程式的品質與一致性,可以減少一些不必要的來回溝通。這不只在開源,在當一個工程部門開始變大的時候也有幫助,畢竟大家寫程式的習慣可能不一樣,有個訂好的規則去遵守,管理會更方便。

最後還是要說,這些 Coding Style 的規則訂定,沒有一定的硬性規定,都是要去多試多討論,才會有個最適合的結論出來,大家也可以多玩玩看。

感謝大家耐心地看完這篇文章,之後套件有什麼可以介紹的更新,可能會持續更新,也歡迎大家直接來貢獻。一樣有任何問題與建議也歡迎留言,各位有緣再見,掰掰。


上一篇
Day 30 - 總整理以及鐵人賽心得
系列文
上次介紹的棒球套件很少更新了,那就只好自己寫一個!?31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言